Programmare con Python: Guida completa by Marco Buttu
autore:Marco Buttu
La lingua: ita
Format: azw3, mobi
editore: LSWR Srl
pubblicato: 2014-12-25T23:00:00+00:00
Import circolari
Quando due moduli si importano a vicenda, si dice che si ha un import circolare (circular import). Gli import circolari sono causa, talvolta, di problemi la cui risoluzione non è immediata. Consideriamo, ad esempio, i seguenti due moduli:
$ ls
main.py mymodule.py
Il modulo main stampa il suo nome, poi importa mymodule e infine assegna la stringa 'main.py' all’etichetta a:
$ cat main.py
print(__name__)
import mymodule
a = 'main.py'
Il modulo mymodule, invece, stampa il suo nome, assegna la stringa 'mymodule.py' all’etichetta a, importa il modulo principale del programma e infine stampa l’etichetta a di quest’ultimo:
$ cat mymodule.py
print(__name__)
a = 'mymodule.py'
import __main__
print(__main__.a)
Ecco cosa accade se eseguiamo mymodule.py da linea di comando:
$ python mymodule.py
__main__
mymodule.py
Viene stampato il nome del modulo, che è '__main__', visto che mymodule.py è stato eseguito da linea di comando. Poi viene eseguita l’istruzione import __main__, la quale, però, non importa __main__ poiché questo è già in esecuzione e quindi presente su sys.modules; l’unico effetto di import __main__ è quello di rendere disponibile l’etichetta __main__. Viene infine stampata __main__.a, ovvero la stringa 'mymodule.py' assegnata all’etichetta a due istruzioni sopra la print().
Ecco, invece, cosa accade se eseguiamo main.py da linea di comando:
$ python main.py
__main__
mymodule
Traceback (most recent call last):
...
AttributeError: 'module' object has no attribute 'a'
Viene stampato il nome del modulo, che anche questa volta è '__main__', visto che main.py è stato eseguito da linea di comando. Fatto ciò, però, prima che venga assegnata l’etichetta a viene importato mymodule, e questa istruzione comporta l’esecuzione del codice contenuto in mymodule.py, ovvero:
1. print(__name__): stampa il nome del modulo, ovvero mymodule;
2. a = 'mymodule.py': assegna la stringa 'mymodule.py' all’etichetta a nel namespace di mymodule;
3. import __main__: il modulo __main__ (associato al file eseguito da linea di comando, main.py) è già presente in sys.modules, quindi non viene importato, e questa istruzione ha il solo effetto di rendere disponibile l’etichetta __main__ nel modulo mymodule;
4. print(__main__.a): questa istruzione dovrebbe stampare __main__.a. Quando, però, Python prova a risolvere l’etichetta a nel namespace del modulo principale, non la trova. Infatti questa etichetta non è stata ancora definita, poiché il flusso di esecuzione in main.py è ancora fermo alla penultima istruzione, import mymodule.
Per evitare questo genere di problemi, possiamo adottare le pratiche elencate alla pagina Programming FAQ del sito ufficiale: http://docs.python.org/3/faq/programming.html, alla sezione intitolata What are the “best practices” for using import in a module?.
Concludiamo questa sezione con una osservazione in merito al modulo __main__. Quando un file mymodule.py viene eseguito da linea di comando, il suo contenuto viene caricato in memoria e associato a un modulo chiamato __main__. Quindi è quest'ultimo a essere presente in sys.modules e non mymodule. Se, pertanto, in mymodule.py avessimo importato main piuttosto che __main__, il problema non si sarebbe presentato:
$ cat mymodule.py
print(__name__)
a = 'mymodule.py'
import main
print(main.a)
$ python main.py
__main__
mymodule
main
main.py
Questo perché, quando il modulo main.py viene eseguito da linea di comando, il suo codice viene caricato in memoria e assegnato al modulo __main__, quindi è questo a essere presente in sys.modules e non main:
$ cat mymodule.py
print(__name__)
a = 'mymodule.py'
import sys
print("'__main__' in sys.modules?", '__main__' in sys.modules)
print("'main' in sys.modules?", 'main' in sys.modules)
import main
print("Dopo l'import: 'main' in sys.modules?", 'main' in sys.
scaricare
Programmare con Python: Guida completa by Marco Buttu.mobi
Questo sito non memorizza alcun file sul suo server. Abbiamo solo indice e link contenuto fornito da altri siti. Contatta i fornitori di contenuti per rimuovere eventuali contenuti di copyright e inviaci un'email. Cancelleremo immediatamente i collegamenti o il contenuto pertinenti.
Mobile HTML5 by Estelle Weyl(2177)
La Sicurezza Informatica. Tra informatica, matematica e diritto (Italian Edition) by Francesca Cirini(1946)
Hello World by Hannah Fry(1942)
Il Manuale Di Arduino by Maik Schmidt(1768)
Linux server per l'amministratore di rete: per Ubuntu, CentOS e Fedora (Italian Edition) by Silvio Umberto Zanzi(1512)
Nel paese degli algoritmi by Aurélie Jean(1498)
Esercizi Di Stile by Unknown(1292)
Sviluppare in PHP 7: Realizzare applicazioni web e API professionali (Italian Edition) by Enrico Zimuel(1112)
E-LEARNING by E-learning(1077)
PYTHON : Il manuale per imparare a programmare. Contiene esempi di codice ed esercizi pratici. (Italian Edition) by Frost Oscar R(1064)
Tutto Mac for dummies: iPhone, iPad, MacBook, iCloud e molto altro by Simone Gambirasio(1059)
Automatizzare le cose noiose con Python: Programmazione pratica per principianti assoluti (Italian Edition) by Sweigart Al(1051)
Novacene by James Lovelock(1035)
9 algoritmi che hanno cambiato il futuro by MacCormick John(971)
Comprendere gli Algoritmi e i diagrammi di flusso passo-passo: Esempi con ausili grafici e tabellari, esercizi e codifica in linguaggio C (Italian Edition) by Luciano Manelli(942)
Amazon by Sconosciuto(934)
On Writing by Stephen King(919)
WEB DEVELOPMENT: La guida completa allo sviluppo web lato client. Impara a programmare con esercizi pratici ed esempi di codice. Include HTML, CSS, PHP, PYTHON, MySQL (Italian Edition) by Ferrati Alberto(915)
Android 4 by Massimo Carli(912)